import { z } from 'zod';

// 创建部门的验证 schema
export const createDeptSchema = z.object({
  parentId: z.number().int().default(0),
  ancestors: z.string().max(50).default('0'),
  deptName: z.string().min(2, '部门名称至少需要2个字符').max(30, '部门名称最多30个字符'),
  orderNum: z.number().int().default(0),
  leader: z.string().min(2, '负责人至少需要2个字符').max(20, '负责人最多20个字符'),
  phone: z.string().max(11, '联系电话最多11个字符').default(''),
  email: z.string().email('请输入有效的电子邮件地址').max(50, '邮箱最多50个字符').default(''),
  status: z.enum(['0', '1']).default('0'), // 0-正常, 1-停用
  remark: z.string().max(500, '备注最多500个字符').optional(),
});

// 更新部门的验证 schema
export const updateDeptSchema = z.object({
  parentId: z.number().int().optional(),
  ancestors: z.string().max(50).optional(),
  deptName: z.string().min(2, '部门名称至少需要2个字符').max(30, '部门名称最多30个字符').optional(),
  orderNum: z.number().int().optional(),
  leader: z.string().min(2, '负责人至少需要2个字符').max(20, '负责人最多20个字符').optional(),
  phone: z.string().max(11, '联系电话最多11个字符').optional(),
  email: z.string().email('请输入有效的电子邮件地址').max(50, '邮箱最多50个字符').optional(),
  status: z.enum(['0', '1']).optional(),
  updateBy: z.string().max(64, '更新者最多64个字符').optional(),
  remark: z.string().max(500, '备注最多500个字符').optional(),
}).refine(data => Object.keys(data).length > 0, {
  message: '至少需要提供一个字段进行更新',
});

// 查询参数 schema
export const queryDeptSchema = z.object({
  deptName: z.string().optional(),
  status: z.enum(['0', '1']).optional(),
  parentId: z.string().refine((val) => !isNaN(Number(val))).optional(),
  pageNum: z.string().refine((val) => !isNaN(Number(val))).default('1'),
  pageSize: z.string().refine((val) => !isNaN(Number(val))).default('10'),
});

// 参数验证 schema
export const paramSchema = z.object({
  id: z.string().refine((val) => !isNaN(Number(val)), {
    message: 'ID 必须是数字',
  }),
});

// 导出类型
export type CreateDeptDto = z.infer<typeof createDeptSchema>;
export type UpdateDeptDto = z.infer<typeof updateDeptSchema>;
export type QueryDeptDto = z.infer<typeof queryDeptSchema>;
export type ParamDto = z.infer<typeof paramSchema>;